// https://leetcode.cn/problems/longest-increasing-subsequence/

// 题干：给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。
//      子序列 是由数组派生而来的序列，删除（或不删除）数组中的元素而不改变其余元素的顺序。
//      例如，[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

// 示例：输入：nums = [10,9,2,5,3,7,101,18]
//       输出：4

// 碎语：记忆化搜索的模板题，

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int lengthOfLIS(vector<int>& nums)
    {
        vector<int> memo(nums.size());
        int ret = 0;
        for (int i = 0 ; i < nums.size() ; i++){
            ret = max(ret, dfs(i, nums, memo));
        }

        return ret;
    }

    int dfs(int pos, vector<int>& nums, vector<int>& memo)
    {
        if (memo[pos]) return memo[pos];

        int ret = 1;
        for (int i = pos + 1 ; i < nums.size() ; i++){
            if (nums[i] > nums[pos]) ret = max(ret, dfs(i, nums, memo) + 1);
        }
        memo[pos] = ret;

        return ret;
    }
};

int main()
{
    Solution sol;
    vector<int> nums = {10,9,2,5,3,7,101,18};

    cout << sol.lengthOfLIS(nums) << endl;

    return 0;
}